//
//  UserAccount.swift
//  MAGweibo
//
//  Created by MagicaL on 15/8/3.
//  Copyright © 2015年 MagicaL. All rights reserved.
//

import UIKit

/**
    1. 直接将字典转为 plist (property list 属性列表)保存
    2. 将字典转为 JSON 保存(越来越普遍)
    3. 归档&解档
    4. SQLite 存储
*/

/// 用户模型
class UserAccount: NSObject,NSCoding {
    // 用于调用access_token，接口获取授权后的access token。
    var access_token: String?
    // access_token的生命周期，单位是秒数。准确数据类型是`数值`
    var expires_in: NSTimeInterval = 0 {
        didSet {
            expiresDate = NSDate(timeIntervalSinceNow: expires_in)
        }
    }
    // 过期日期
    var expiresDate: NSDate?
    // 当前授权用户的UID。
    var uid: String?
    
    
    init(dict: [String : AnyObject]) {
        super.init()
        
        setValuesForKeysWithDictionary(dict)
    }
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
    /// 对象描述信息 重写description 方法
    override var description: String {
    
        let properties = ["access_token","expires_in","uid","expiresDate"]
        
        return "\(dictionaryWithValuesForKeys(properties))"
    }

    // MARK: - 归档 & 解档的方法
    /// 保存归档文件的路径
    static private let accountPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentationDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!.stringByAppendingPathComponent("account.plist")
    
    /// 保存用户账号
    func saveAccount() {
        NSKeyedArchiver.archiveRootObject(self, toFile: UserAccount.accountPath)
    }
    
    /**
        1. 如果没有登录 返回空
        2. 如果token过期 返回空
    
        由于后续网络访问都依赖 token ,每次都要读取
        如果每次解档都需要从磁盘进行读取(磁盘I/O操作) 实际开发要注意性能!
    */
    
    static var userAccount: UserAccount?
    class func loadAccount() -> UserAccount? {
        
//        // 判断静态账户是否存在 如果不存在 则需要解档
//        if userAccount == nil {
//            if let account = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as? UserAccount {
//                // 判断 token 是否过期 过期时间 > 当前时间 表示没有过期
//                if account.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
//                        return account
//                    }
//                }
//            } else {
//                // 判断日期
//                // // 判断 token 是否过期 过期时间 > 当前时间 表示没有过期
//                if userAccount!.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending{
//                    return userAccount
//                }
//            }
        /// 代码优化后
        // 1.判断账户是否存在 不存在则解档
        if userAccount == nil {
            userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as? UserAccount
        }
        if let date = userAccount?.expiresDate where date.compare(NSDate()) == NSComparisonResult.OrderedAscending {
            // 如果过期清空账号记录
            userAccount == nil
        }
        return userAccount
    }
    
    

    // MARK: - NSCoding
    /// 归档 -> 保存,将自定义对象保存成二进制数据保存到磁盘
    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(access_token, forKey: "access_token")
        aCoder.encodeDouble(expires_in, forKey: "expires_in")
        aCoder.encodeObject(expiresDate, forKey: "expiresDate")
        aCoder.encodeObject(uid, forKey: "uid")
    }
    /// 解档 -> 恢复,将二进制数据从磁盘中恢复成对象
    required init?(coder aDecoder: NSCoder) {
        access_token = aDecoder.decodeObjectForKey("access_token") as? String
        expires_in = aDecoder.decodeDoubleForKey("expires_in")
        expiresDate = aDecoder.decodeObjectForKey("expiresDate") as? NSDate
        uid = aDecoder.decodeObjectForKey("uid") as? String
    }
    
    
}
